package org.warm.meaning.x.base.common.vo;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 结果数据集VO
 *
 * @author WarmMeaning
 * @date 2025-01-02
 */
@Getter
public class ResultVo<T> {

    /**
     * 默认成功返回码
     */
    public static final String DEFAULT_SUCCESS_CODE = "0";

    /**
     * 默认失败返回码
     */
    public static final String DEFAULT_FAIL_CODE = "-1";

    /**
     * 状态码
     */
    public String code;

    /**
     * 数据
     */
    public T data;

    /**
     * 消息
     */
    public String msg;

    /**
     * 内部数据存储
     */
    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    private volatile Map<String, Object> innerMap = new HashMap<>();

    /**
     * 初始化一个新创建的 ResultVo 对象，使其表示一个空消息。
     */
    public ResultVo() {
    }

    /**
     * 初始化一个新创建的 ResultVo 对象
     *
     * @param code 状态码
     * @param msg  返回消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public ResultVo(String code, String msg) {
        this();
        this.code = code;
        this.msg = msg;
    }

    /**
     * 初始化一个新创建的 ResultVo 对象
     *
     * @param code 状态码
     * @param data 数据对象
     * @param msg  返回消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public ResultVo(String code, T data, String msg) {
        this(code, msg);
        this.data = data;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> success() {
        return ResultVo.success("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> success(T data) {
        return ResultVo.success(data, "操作成功");
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> success(String msg) {
        return ResultVo.success(null, msg);
    }

    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> success(T data, String msg) {
        return new ResultVo<>(DEFAULT_SUCCESS_CODE, data, msg);
    }

    /**
     * 返回成功消息
     *
     * @param code 状态码
     * @param data 数据对象
     * @param msg  返回内容
     * @return 成功消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> success(String code, T data, String msg) {
        return new ResultVo<>(code, data, msg);
    }

    /**
     * 返回错误消息
     *
     * @return 错误消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> fail() {
        return ResultVo.fail("操作失败");
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 错误消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> fail(String msg) {
        return ResultVo.fail(null, msg);
    }

    /**
     * 返回错误消息
     *
     * @param data 数据对象
     * @param msg  返回消息
     * @return 错误消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> fail(T data, String msg) {
        return new ResultVo<>(DEFAULT_FAIL_CODE, data, msg);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param data 数据对象
     * @param msg  返回消息
     * @return 错误消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public static <T> ResultVo<T> fail(String code, T data, String msg) {
        return new ResultVo<>(code, data, msg);
    }

    /**
     * 是否为成功消息
     *
     * @return 结果
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public boolean isSuccess() {
        return Objects.equals(DEFAULT_SUCCESS_CODE, this.code);
    }

    /**
     * 是否为错误消息
     *
     * @return 结果
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public boolean isError() {
        return Objects.equals(DEFAULT_FAIL_CODE, this.code);
    }

    /**
     * @param code 状态码
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public ResultVo<T> setCode(String code) {
        this.code = code;
        return this;
    }

    /**
     * @param data 状态码
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public ResultVo<T> setData(T data) {
        this.data = data;
        return this;
    }

    /**
     * @param msg 返回消息
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public ResultVo<T> setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    /**
     * 方便链式调用
     *
     * @param key   键
     * @param value 值
     * @return 数据对象
     * @author WarmMeaning
     * @date 2025-01-02
     */
    public ResultVo<T> put(String key, Object value) {
        if (null == innerMap) {
            synchronized (this) {
                if (null == innerMap) {
                    this.innerMap = new HashMap<>();
                }
            }
        }
        this.innerMap.put(key, value);
        return this;
    }

}
